package cn.zwx.common.rocket.producer.service;

import cn.zwx.base.exception.BizWrapException;
import cn.zwx.common.rocket.producer.bo.MessageBO;
import cn.zwx.common.rocket.producer.bo.OrderMessageBO;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.client.producer.SendCallback;

/**
 * @author zhangwenxue
 */
public interface DefaultMqProducerService extends MqProducerService{

    /**
     *  发送消息
     * <code>
     *     如果需要发送延时消息 setStartDeliverTime() 设置消息需要被投递的时间
     *     定时消息，单位毫秒（ms），在指定时间戳（当前时间之后）进行投递，例如2016-03-07 16:21:00投递。
     *     如果被设置成当前时间戳之前的某个时刻，消息将立刻投递给消费者
     * </code>
     * @param message 消息信息体信息
     * @return SendResult
     * @author zhangwenxue
     * @throws BizWrapException 业务异常
     **/
    SendResult sendMsg(MessageBO message) throws BizWrapException;
    /**
     *  只管发送不会给回执
     * @param message message
     * @author zhangwenxue
     * @throws BizWrapException 业务异常
     **/
    void sendMsgForOneWay(MessageBO message) throws BizWrapException;

    /**
     *  异步发现消息
     * @param message message
     * @param callback callback
     * @author zhangwenxue
     * @throws BizWrapException 业务异常
     **/
    void sendMsgAsync(MessageBO message, SendCallback callback) throws BizWrapException;

    /**
     *  顺序消息
     * <code>这里保证的是局部有序
     * 比如 一个流程 下单 发货 签收
     * </code>
     * @param bo bo
     * @param shardingKey shardingKey
     * // 分区顺序消息中区分不同分区的关键字段，Sharding Key与普通消息的key是完全不同的概念。
     * // 全局顺序消息，该字段可以设置为任意非空字符串。
     * @author zhangwenxue
     * @throws BizWrapException 业务异常
     * @return SendResult
     **/
    SendResult sendOrderMsg(OrderMessageBO bo , String shardingKey) throws BizWrapException;

}
